#include <iostream>

using namespace std;

/*
 * 赋值运算符重载
 *  c++编译器至少给一个类添加4个函数
 *      1、默认构造函数（无参）
 *      2、默认析构函数（无参）
 *      3、默认拷贝构造函数，对属性进行值拷贝
 *      4、赋值运算符operator=，对属性进行值拷贝
 */

class Person{
public:
    int * p_a;
    Person(int a){
        p_a = new int(a);
    }
    ~Person(){
        if(p_a != NULL){
            delete p_a;
            p_a = NULL;
        }
    }
    // 链式返回
    Person & operator=(Person &p){
        if(p_a != NULL){
            delete p_a;
            p_a = NULL;
        }
        p_a = new int(*p.p_a);
        return *this;
    }
};

void test(){
    Person p1(10);
    Person p2(20);
    Person p3(30);
    p3 = p2 = p1;  // 非链式返回，此处报错
    cout << "p1.p_a= " << *p1.p_a << endl;
    cout << "p2.p_a= " << *p2.p_a << endl;
    cout << "p3.p_a= " << *p3.p_a << endl;
}

int main() {

    test();

    return 0;
}
